/*
 * CKeyboardControl.h
 *
 *  Created on: 05.10.2012
 *      Author: Caffeine
 */

#ifndef CKeyboardControl_H_
#define CKeyboardControl_H_

#include "IStepObject.h"
#include "SKeyStatus.h"
#include "../object/MoveableObjects.h"
#include <Keycodes.h>
#include <IReferenceCounted.h>


namespace irr{
namespace control{

/***
 * @class CKeyboardControl
 * Класс управляет движемым объектом через клавиатуру
 */
class CKeyboardControl:public virtual IStepObject,public virtual irr::IReferenceCounted{
private:
	irr::object::MoveableObjects*moveableObjects;
	SKeyStatus key_move;
	SKeyStatus key_move_back;
	SKeyStatus key_shift_left;
	SKeyStatus key_shift_right;
public:
	enum KeyBindType{
		KBT_MOVE=1,
		KBT_MOVE_BACK,
		KBT_SHIFT_LEFT,
		KBT_SHIFT_RIGHT
	};
	CKeyboardControl();
	~CKeyboardControl();
	/***
	 * Устанавливает какой объект нужно двигать
	 *
	 * @param object объект, которым нужно управлять данному контролеру
	 */
	virtual void setMoveableObjects(irr::object::MoveableObjects*object);

	/***
	 * Возвращяет какой объект двигает контролер
	 */
	virtual irr::object::MoveableObjects*getMoveableObjects();

	/***
	 * Проверяет нажатые клавишы, и если нужно, то отдаёт команды управляемому объекту
	 *
	 * @param deltatime время отрисовки кадра (с учётом расчётов), в секундах
	 */
	virtual void step(irr::f32 deltatime);

	/***
	 * Сообщяет контролеру о том, что клавиша key нажата. Если менаджер обрабатывает эту клавишу,
	 * то вернёт TRUE, иначе FALSE. При следующем выполнении step() контролер отдаст команду
	 * управляемому объекту в соответствии с нажатой клавишей
	 *
	 * @param key нажатая клавиша
	 * @return если клавиша key назначина на какой то тип действия, вернёт TRUE, иначе FALSE
	 */
	bool keyDown(irr::EKEY_CODE key);

	/***
	 * Сообщяет контролеру о том, что клавиша key отжата. Если менаджер обрабатывает эту клавишу,
	 * то вернёт TRUE, иначе FALSE. При следующем выполнении step() контролер отдаст команду
	 * управляемому объекту в соответствии с нажатой клавишей
	 *
	 * @param key отпущеная клавиша
	 * @return если клавиша key назначина на какой то тип действия, вернёт TRUE, иначе FALSE
	 */
	bool keyUp(irr::EKEY_CODE key);

	/***
	 * Устанавливает клавишу на определённое действие
	 *
	 * @param key клавиша, которое нужно назначить на указанное действие
	 * @param type тип действия
	 */
	void setBindKey(irr::EKEY_CODE key,KeyBindType type);

	/***
	 * Возвращяет клавишу, которая назначина на указанный тип
	 *
	 * @param type тип клавишы
	 * @return клавиша которая назначина на указанный в параметре type тип
	 */
	char getBindKey(KeyBindType type);

	/***
	 * Возвращяет нажата ли клавиша с указанным типом
	 *
	 * @param type тип клавишы
	 */
	bool isKeyDown(KeyBindType type);
};

}//namespace control
}//namespace irr

#endif /* CKeyboardControl_H_ */
